import logging
import os
from importlib import import_module

from flask import Blueprint

__all__ = ['modules']

logger = logging.getLogger('WebImporter')


# noinspection SpellCheckingInspection
def load_modules() -> tuple:
    """
    加载模块

    :return: 返回 Blueprint 元组
    """
    _modules = list()
    # 根据该脚本所在位置，计算 `aicenter.web` 包的路径
    path = os.path.abspath(os.path.join(__file__, '..'))
    # 遍历 `web` 包下的一级子目录
    for name in os.listdir(path):
        # 排除非目录的目标
        if not os.path.isdir(os.path.join(path, name)):
            continue
        # 排除名为 `_basic` 与 `__pycache__` 的目标
        if name in ('_basic', '__pycache__'):
            continue
        # 排除不以 `_` 开头的目标
        if not name.startswith('_'):
            logger.warning(f'The package `aicenter.web.{name}` is ignored because '
                           f'the package name does not start with `_`.')
            continue
        # 加载模块
        module = import_module(f'.{name}', 'aicenter.web')
        # 检查该模块是否导出 `module` 属性
        if 'module' not in dir(module):
            logger.warning(f'The package `aicenter.web.{name}` is ignored because it does not export `module`.')
            continue
        # 获取被导出的 module 属性
        module = module.module
        # 检查 module 是否属于 Blueprint 的子类
        if not isinstance(module, Blueprint):
            logger.warning(f'The package `aicenter.web.{name}` is ignored because '
                           f'the exported `module` is not a `Blueprint`.')
            continue
        # 保存该模块
        _modules.append(module)
    return tuple(_modules)


modules = load_modules()
